package com.qsl.ssyx;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 线程池-多任务组合:
 * 1. allOf：等待所有任务完成
 * 2. anyOf：只要有一个任务完成
 * allOf 或 anyOf：
 * -  get()： 获取计算结果（要抛异常）
 * -  join() ：获取计算结果。
 * ======》 本次为get，join省略。。。
 */
public class CompletableFutureDemo5 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 创建线程-线程池
        ExecutorService executorService = Executors.newFixedThreadPool(3);

        System.out.println(" main begin...");
        // 任务A 返回结果 1024
        CompletableFuture<Integer> futureA = CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(1000); // 暂停1秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("当前线程名称为： " + Thread.currentThread().getName());
            int result = 1024;
            System.out.println("任务A: " + result);
            return result;
        }, executorService);

        // 任务B: 返回结果 2048
        CompletableFuture<Integer> futureB = CompletableFuture.supplyAsync(() -> {
            System.out.println("当前线程名称为： " + Thread.currentThread().getName());
            int result = 2048;
            System.out.println("任务B: " + result);
            return result;
        }, executorService);

        // 等待futureA和 futureB任务结束
        CompletableFuture<Void> allOf = CompletableFuture.allOf(futureA, futureB);
        System.out.println("获取任务结果: " + allOf.get());


    }
}
